package baiqitun.stupro.subject.service;

import baiqitun.stupro.common.service.MyService;
import baiqitun.stupro.security.entity.SysUser;
import baiqitun.stupro.subject.entity.SysStudentInfo;
import org.flowable.task.api.Task;

import java.time.LocalDateTime;
import java.util.List;
import java.util.Set;

/**
 * <p>
 * 学生信息表 服务类
 * </p>
 *
 * @author kedaji
 * @since 2020-04-01
 */
public interface SysStudentInfoService extends MyService<SysStudentInfo> {
    /**
     * 获取学生信息
     * @param userId 用户id
     * @return 学生信息
     */
     SysStudentInfo getStudentInfoByUserId(String userId);

    /**
     * 保存一名学生到指定部门（班级）
     * @param user 用户信息
     * @param studentInfo 学生信息
     * @param departId 部门id
     */
    void saveToDepart(SysUser user, SysStudentInfo studentInfo, String departId);

    /**
     * 向导师发出【选择导师】申请
     * @param studentUserId 学生用户id
     * @param tutorId 导师用户id
     * @param description 备注
     */
    void sendSelectTutorRequest(String studentUserId, String tutorId, String description);

    /**
     * 向撤回【选择导师申请】
     * @param taskId 任务id
     * @param description 备注
     */
    void withinSelectTutorRequest(String taskId, String description);

    /**
     * 向当前选择的导师发送取消申请
     * @param studentUserId 学生id
     * @param description 备注
     */
    void sendCancelSelectedTutorRequest(String studentUserId, String description);

    /**
     * 获取用户当前待处理的任务个数
     * @param studentUserId 学生用户id
     * @return 任务列表
     */
    List<Task> listTaskForSelectTutorRequest(String studentUserId);

    /**
     * 某届的某班级的学生
     * @param departId 班级id
     * @param year 届
     * @return 班级的学生列表
     */
    List<SysUser> listStudentForClassOfYear(String departId, Integer year);
    /**
     * 获取导师带领的某届一生一品学生
     * @param tutorId 导师id
     * @param year 第几届
     * @return 学生列表
     */
    List<SysUser> listStudent(String tutorId, int year);

    /**
     * 获取学生信息所在的用户
     * @param studentInfoId 学生信息id
     * @return 用户信息
     */
    SysUser getUserOfStudentInfo(String studentInfoId);

    /**
     * 获取系统一生一品学生最低的届（年年份）
     * @return 第几届
     */
    int minYear();

    /**
     * 获取系统一生一品学生最高的届（年）
     * @return 第几届
     */
    int maxYear();

    /**
     * 获取一生一品各届的年份
     * @return 各届年份
     */
    List<Integer> years();
}
